<?php
/**
 * Created by PhpStorm.
 * User: s.utkin
 * Date: 13.01.2015
 * Time: 23:55
 */

namespace Pinenut\Service\UrlRule;


use Pinenut\Security\Encryption\LiteEncryptor;
use Pinenut\Service\UrlRule;

class PhotosThumb extends UrlRule {
	private $rule;
	private $route;

	public function __construct($rule)
	{
		// заполняем в конструкторе наши параметры.
		$this->rule = new Standart($rule);
		$this->route = $rule['action'];
	}

	function parseUrl($url = null, $method = null, $host = null, $params = null)
	{
		$rule = $this->rule;
		$request = $rule->parseUrl($url, $method, $host, $params);

		// в случае если нам не удалось распарсить стандартным, просто вертаем фолс.
		if (! $request) {
			return false;
		}

		$data = LiteEncryptor::decrypt($request->pid);
		$dataLength = strlen($data);

		if (!$data || $dataLength < 25) {
			return false;
		}

		$type = substr($data, 0, $dataLength - 24);
		$id = substr($data, $dataLength - 24, 24);

		if (!preg_match('/[a-f0-9]{24}/', $id)) {
			return false;
		}

		$params = [
			'id' => $id,
			'thumb' => $type,
		];

		$request->params($params);
		return $request;
	}

	/**
	 * Формирируем адрес
	 * @param string $action - имя действия
	 * @param array $params - параметры
	 * @param string $abs - признак того, что нужен полный абсолютный адрес
	 */
	function createUrl($action, array $params, $abs = false)
	{
		$rule = $this->rule;
		// в случае если роут в конструкторе не подходит роуту в стандартном правиле возвращаем ложь
		if ($action !== $rule->route) {
			return false;
		}

		$thumb = $params['thumb'];
		$id = $params['id'];

		if (!$id) {
			throw new \Exception("Wrong picture id: '$id'");
		}

		if (!$thumb) {
			throw new \Exception("Wrong thumb: '$thumb'");
		}

		$privateId = LiteEncryptor::encrypt($thumb.$id);
		// вызываем креат стандартного рула.
		$url = $rule->createUrl($action, ['pid' => $privateId], $abs);

		return $url;
	}
}